/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.mindbox.mueblesalpes.negocio.entity;

import java.io.Serializable;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

/**
 * Clase que representa un Cliente de la aplicación
 * @author Diana Carolina
 */
@Entity
@Table(name="cliente")
public class Cliente implements Serializable,Cloneable {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_CLIENTE")
    @SequenceGenerator(name = "SEQ_CLIENTE", allocationSize = 1, sequenceName = "cliente_seq")
    private Long idCliente;

    @Enumerated(EnumType.STRING)
    private TipoDocumento tipoDocumento;
    private String numeroDocumento;
    private String nombreCompleto;
    private String telefonoResidencia;
    private String celular;
    private String direccion;
    @OneToOne
    private Ciudad ciudadResidencia;
    private String profesion;
    private String email;
    @OneToOne(cascade=CascadeType.ALL)
    private Usuario usuario;


    /**
     * Obtiene el número de celular del cliente
     * @return
     */
    public String getCelular() {
        return celular;
    }

    /**
     * Asigna el número de celular del cliente
     * @param celular
     */
    public void setCelular(String celular) {
        this.celular = celular;
    }

    /**
     * Obtiene el nombre de la ciudad de residencia del cliente
     * @return
     */
    public Ciudad getCiudadResidencia() {
        return ciudadResidencia;
    }

    /**
     * Asigna el nombre de la ciudad de residencia del cliente
     * @param ciudadResidencia
     */
    public void setCiudadResidencia(Ciudad ciudadResidencia) {
        this.ciudadResidencia = ciudadResidencia;
    }

    /**
     * Obtiene la dirección de residencia del cliente
     * @return
     */
    public String getDireccion() {
        return direccion;
    }

    /**
     * Asigna la dirección de residencia del cliente
     * @param direccion
     */
    public void setDireccion(String direccion) {
        this.direccion = direccion;
    }

    /**
     * Obtiene el email del cliente
     * @return
     */
    public String getEmail() {
        return email;
    }

    /**
     * Asigna el email del cliente
     * @param email
     */
    public void setEmail(String email) {
        this.email = email;
    }

    /**
     * Obtiene el nombre completo del cliente (nombres y apellidos)
     * @return
     */
    public String getNombreCompleto() {
        return nombreCompleto;
    }
    /**
     * Asigna el nombre completo del cliente (nombres y apellidos)
     * @param nombreCompleto
     */
    public void setNombreCompleto(String nombreCompleto) {
        this.nombreCompleto = nombreCompleto;
    }

    /**
     * Obtiene el número de documento de identificación del cliente
     * @return
     */
    public String getNumeroDocumento() {
        return numeroDocumento;
    }

    /**
     * Asigna el número de documento de identificación del cliente
     * @param numeroDocumento
     */
    public void setNumeroDocumento(String numeroDocumento) {
        this.numeroDocumento = numeroDocumento;
    }

    /**
     * Obtiene la profesión del cliente
     * @return
     */
    public String getProfesion() {
        return profesion;
    }

    /**
     * Asigna la profesión del cliente
     * @param profesion
     */
    public void setProfesion(String profesion) {
        this.profesion = profesion;
    }

    /**
     * Obtiene el número de teléfono de residencia del cliente
     * @return
     */
    public String getTelefonoResidencia() {
        return telefonoResidencia;
    }

    /**
     * Asigna el número de teléfono de residencia del cliente
     * @param telefonoResidencia
     */
    public void setTelefonoResidencia(String telefonoResidencia) {
        this.telefonoResidencia = telefonoResidencia;
    }

    /**
     * Obtiene el tipo de documento de identificacion del cliente
     * @return
     */
    public TipoDocumento getTipoDocumento() {
        return tipoDocumento;
    }

    /**
     * Asigna el tipo de documento de identificación del cliente
     * @param tipoDocumento
     */
    public void setTipoDocumento(TipoDocumento tipoDocumento) {
        this.tipoDocumento = tipoDocumento;
    }
    /**
     * Obtiene el valor del identificador de cliente
     * @return id unico de cliente
     */
    public Long getIdCliente() {
        return idCliente;
    }
    /**
     * Asigna el valor del id del cliente
     * @param idCliente
     */
    public void setIdCliente(Long idCliente) {
        this.idCliente = idCliente;
    }
    /**
     * Realiza la duplicación del objeto Cliente
     * @return
     * @throws java.lang.CloneNotSupportedException
     */
    @Override
    public Object clone() throws CloneNotSupportedException {
        Cliente c = new Cliente();
        c.setIdCliente(this.idCliente);
        c.setTipoDocumento(this.tipoDocumento);
        c.setNumeroDocumento(this.numeroDocumento);
        c.setNombreCompleto(this.nombreCompleto);
        c.setTelefonoResidencia(this.telefonoResidencia);
        c.setCelular(this.celular);
        c.setDireccion(this.direccion);
        return c;
     }
     /**
      * Determina si el objeto es igual a Cliente
      * @param obj a ser comparado
      * @return true o false
      */
    @Override
    public boolean equals(Object obj) {
       if(obj instanceof Cliente)
            return this.idCliente.longValue() == ((Cliente)obj).getIdCliente().longValue();
        return super.equals(obj);
    }
    /**
     * Obtiene la clave del objeto Cliente
     * @return
     */
    @Override
    public int hashCode() {
        if(this.getIdCliente() == null)
            return 0;
        return this.getIdCliente().hashCode();
    }

    /**
     * Obtiene el objeto Usuario
     * @return the usuario
     */
    public Usuario getUsuario() {
        return usuario;
    }

    /**
     * Asigna un valor al objeto usuario
     * @param usuario the usuario to set
     */
    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }
}
